package user

import (
	"strconv"
	"x-admin/backend/pkg/response"

	"github.com/gin-gonic/gin"
)

// Handler 用户处理器
type Handler struct {
	service Service
}

// NewHandler 创建用户处理器
func NewHandler(service Service) *Handler {
	return &Handler{
		service: service,
	}
}

// Create 创建用户
// @Summary 创建用户
// @Description 创建新的用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param user body CreateRequest true "用户信息"
// @Success 200 {object} response.Response{data=UserWithRoles} "创建成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /users [post]
func (h *Handler) Create(c *gin.Context) {
	var req CreateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	user, err := h.service.Create(&req)
	if err != nil {
		if err.Error() == "用户名已存在" || err.Error() == "邮箱已存在" {
			response.BadRequest(c, err.Error())
			return
		}
		response.InternalServerError(c, "创建用户失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "创建用户成功", user)
}

// GetByID 根据ID获取用户
// @Summary 获取用户详情
// @Description 根据ID获取用户详细信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Success 200 {object} response.Response{data=UserWithRoles} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "用户不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /users/{id} [get]
func (h *Handler) GetByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的用户ID")
		return
	}

	user, err := h.service.GetByID(uint(id))
	if err != nil {
		if err.Error() == "用户不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "获取用户失败: "+err.Error())
		return
	}

	response.Success(c, user)
}

// Update 更新用户
// @Summary 更新用户
// @Description 根据ID更新用户信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Param user body UpdateRequest true "用户信息"
// @Success 200 {object} response.Response{data=UserWithRoles} "更新成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "用户不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /users/{id} [put]
func (h *Handler) Update(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的用户ID")
		return
	}

	var req UpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	user, err := h.service.Update(uint(id), &req)
	if err != nil {
		if err.Error() == "用户不存在" {
			response.NotFound(c, err.Error())
			return
		}
		if err.Error() == "用户名已存在" || err.Error() == "邮箱已存在" {
			response.BadRequest(c, err.Error())
			return
		}
		response.InternalServerError(c, "更新用户失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "更新用户成功", user)
}

// Delete 删除用户
// @Summary 删除用户
// @Description 根据ID删除用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Success 200 {object} response.Response "删除成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "用户不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /users/{id} [delete]
func (h *Handler) Delete(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的用户ID")
		return
	}

	if err := h.service.Delete(uint(id)); err != nil {
		if err.Error() == "用户不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "删除用户失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "删除用户成功", nil)
}

// List 获取用户列表
// @Summary 获取用户列表
// @Description 分页获取用户列表
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Param keyword query string false "关键词搜索"
// @Param username query string false "用户名"
// @Param email query string false "邮箱"
// @Param status query int false "状态"
// @Success 200 {object} response.PageResponse{data=[]UserWithRoles} "获取成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /users [get]
func (h *Handler) List(c *gin.Context) {
	var req QueryRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	users, total, err := h.service.List(&req)
	if err != nil {
		response.InternalServerError(c, "获取用户列表失败: "+err.Error())
		return
	}

	response.Page(c, users, total, req.Page, req.PageSize)
}

// ResetPassword 重置密码
// @Summary 重置用户密码
// @Description 管理员重置用户密码
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Param password body ResetPasswordRequest true "新密码"
// @Success 200 {object} response.Response "重置成功"
// @Failure 400 {object} response.Response "请求参数错误"
// @Failure 404 {object} response.Response "用户不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Security BearerAuth
// @Router /users/{id}/reset-password [post]
func (h *Handler) ResetPassword(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.BadRequest(c, "无效的用户ID")
		return
	}

	var req ResetPasswordRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.BadRequest(c, "请求参数错误: "+err.Error())
		return
	}

	if err := h.service.ResetPassword(uint(id), &req); err != nil {
		if err.Error() == "用户不存在" {
			response.NotFound(c, err.Error())
			return
		}
		response.InternalServerError(c, "重置密码失败: "+err.Error())
		return
	}

	response.SuccessWithMessage(c, "密码重置成功", nil)
}
